include io16.inc
assume cs:codeseg, ds:dataseg, ss:stackseg
dataseg segment
;----------- 音符频率表 mus_freq -----------
mus_freq    dw  659, 587, 524, 587     ; 3 2 1 2
            dw  659, 698, 659, 587     ; 3.4 3 2.
            dw  659, 587, 524, 587     ; 3 2 1 2
            dw  659, 698, 659, 587     ; 3.4 3 2.

            ; 重复段落
            dw  659, 587, 524, 587     ; 3 2 1 2
            dw  659, 698, 659, 587     ; 3.4 3 2.
            dw  659, 587, 524, 587     ; 3 2 1 2
            dw  659, 698, 659, 587, 262, 294    ; 3.4 3 2. 1 2

            ; 主旋律
            dw  330, 330, 294, 349, 330, 294  ;3 3 2 4 3 2
            dw  294, 294, 262, 262           ;2 2 1 1
            dw  349, 330, 294                 ;4 3 2
            dw  294, 262, 294, 330            ;2 1 2 3.

            ; 间奏
            dw  0, 330, 392, 523              ;0. 351
            dw  494, 524, 494, 524            ;7 i 7 i
            dw  494, 440, 392, 392, 294, 262       ;76 5 524
            dw  349, 330, 330, 392            ;4 3 3 5
            dw  349, 330, 294, 330, 196            ;432 3 5

            ; 主歌
            dw  262, 0, 262             ;1. 0 1
            dw  294, 262, 262            ;21.1
            dw  262, 392, 262                 ;151
            dw  349, 330, 294, 262            ;4 3 2 1
            dw  262, 0, 262, 294              ;1.0 12

           ; 主旋律
            dw  330, 330, 294, 349, 330, 294  ;3 3 2 4 3 2
            dw  294, 294, 262           ;2 2 1
            dw  349, 330, 294                 ;4 3 2
            dw  294, 262, 294, 330            ;2 1 2 3.

            ; 间奏
            dw  0, 330, 392, 523              ;0. 351
            dw  494, 524, 494, 524            ;7 i 7 i
            dw  494, 440, 392, 392, 294, 262       ;76 5 524
            dw  349, 330, 330, 196            ;4 3 3 5
            dw  349, 330, 294, 330, 394            ;432 3 5

            ; 副歌
            dw  262, 0, 262, 262                    ;1. 0 11
            dw  294, 262, 262, 392, 262             ;21 151
            dw  349, 349, 349, 330, 294, 294, 262   ;4 4 4 3 2 21
            dw  262, 0, 0                           ;1.0 0.

            ; 桥段（完整展开）
            dw  880, 784, 784, 784, 698, 698   ;655 544
            dw  659, 587, 587, 587, 0, 392          ;322 205
            dw  392, 349, 349, 349, 349, 330, 294   ;544 4 432
            dw  294, 262, 247, 162, 0               ;217 1.0.

            ; 重复桥段
            dw  880, 784, 784, 784, 698, 698   ;655 544
            dw  659, 587, 587, 587, 0, 330          ;322 203
            dw  330, 330, 330, 330, 330, 330, 294, 330   ;333 33 323
            dw  587, 524, 524, 0, 524             ;2 i 101

            ; 尾奏
            dw  494, 440, 440               ;7 6 6.
            dw  0, 440, 440, 392, 349, 349          ;0 6 654 4
            dw  349, 330, 349, 392             ;4.34 5
            dw  392, 0                      ;5.0.

            dw  330,294,330,294,330,349    ; |3 2 3 2 3 4|
            dw  392,0,349,392              ; |5 0 4 5|
            dw  440,0,440,494              ; |6 0 6 7|
            dw  524,0,587,524              ; |1 0 2 i|
            dw  392,0,262                  ; |5 0 1|
            dw  392,349,349                ; |5 4 4|
            dw  330,330,349                ; |3 3 4|
            dw  392,0                      ; |5 0|

            ; 第二段重复
            dw  330,294,330,294,330,349    ; |3 2 3 2 3 4|
            dw  392,0,349,392              ; |5 0 4 5|
            dw  440,0,416,494              ; |6 0 5 6|
            dw  494,0,330              ; |7 0 ·3|
            dw  659,659,0,330                  ; |3 3 0 3|
            dw  698,659,587                ; |4 3 2|
            dw  587,524,494                ; |2 i 7|
            dw  524,0,392,524                      ; |1 0 5 i|

            ; 高潮段
            dw  587,524,524,0,392          ; |2 i 1 0 5|
            dw  587,524,524,0,392,524      ; |2 i 1 0 5 i|
            dw  587,524,524,0,392,524      ; |2 i 1 0 5 i|
            dw  587,659,587,524,0,524      ; |2 ·3 2 i 0 i|

            ; 尾奏
            dw  494,440,440,0,392          ; |7 6 6 0 5|
            dw  392,349,349,330,294        ; |5 4 4 3 2|
            dw  330,0                    ; |3 ·0·|
            dw  330,349,330,349,330,294     ; |3 4 3 4 3 2|
            dw  262,262                ; |1 ·1·|

            dw  0, 262, 294, 330, 330, 294, 349, 330, 294   ;0.-12 |332 432
            dw  294, 294, 262, 262, 349, 330, 294  ;2211 432
            dw  294, 294, 262, 294, 330    ;2.2123.

            ; 间奏段落
            dw  0, 330, 392, 523          ;0.351
            dw  494, 524, 494, 524        ;7 i 7 i
            dw  494, 440, 392, 392, 294, 262       ;76 5 524
            dw  349, 330, 330, 196            ;4 3 3 5
            dw  349, 330, 294, 330, 394            ;432 3 5

            ; 主歌
            dw  262, 262, 0, 262, 262                    ;1.1 011
            dw  294, 262, 262, 392, 262              ;21 151
            dw  349, 330, 294, 262    ;4 3 21
            dw  262, 0                            ;1.0.

            ; 桥段（高八度处理）
            dw  880, 784, 784, 784, 698, 698   ;655 544
            dw  659, 587, 587, 587, 0, 392          ;322 205
            dw  392, 349, 349, 349, 349, 330, 294   ;544 4 432
            dw  294, 262, 247, 162, 0               ;217 1.0.

            ; 重复桥段
            dw  880, 784, 784, 784, 698, 698   ;655 544
            dw  659, 587, 587, 587, 0, 330          ;322 203
            dw  330, 330, 330, 330, 330, 330, 294, 330   ;333 33 323
            dw  587, 524, 524, 0, 524             ;2 i 101

            ; 特殊段落（带高音标记）
            dw  494, 440, 440               ;7 6 6.
            dw  0, 440, 440, 392, 349, 349          ;0 6 654 4
            dw  349, 330, 349, 392             ;4.34 5
            dw  392, 0                      ;5.0.

            ; ; 括号段落1（高八度重复）
            ; dw  698, 880, 880, 523, 880   ;4'6'6 '3 '64
            ; dw  880, 698, 698, 698       ;644 444
            ; dw  262, 262, 262, 294, 294, 294  ;111 222
            ; dw  262, 262, 262, 262       ;111 111

            ; ; 括号段落2（和声变化）
            ; dw  698, 880, 880, 523, 880   ;4'6'6 '3 '64
            ; dw  880, 698, 349, 698       ;644 343
            ; dw  262, 262, 262, 294, 294, 294  ;111 222
            ; dw  262, 262, 262, 330, 330, 330  ;111 333

            ; ; 高潮段
            ; dw  294, 262, 262, 262, 262, 262, 330, 0  ;211111 310
            ; dw  294, 262, 262, 262, 262, 262, 440     ;211111 2116
            ; dw  392, 330, 330, 0                      ;533.
            ; dw  262, 262, 262, 262, 262, 262, 262     ;(11111 111)

            dw  -1                             ; 结束标志

;----------- 音符时值表 mus_time -----------
mus_time    dw  24,12,24,12, 18,6,12,36      ; 基础节奏
            dw  24,12,24,12, 18,6,12,36      ; 重复段落
            dw  24,12,24,12, 18,6,12,36
            dw  24,12,24,12, 18,6,12,24,6,6

            ; 主旋律时值
            dw  12,12,12,12,12,12            ;3 3 2 4 3 2
            dw  12,12,6,6                 ;2 2 1 1
            dw  12,12,12                     ;4 3 2
            dw  24,6,6,36                 ;2 1 2 3.

            ; 间奏时值
            dw  36,12,12,12                  ;0.351 (附点)
            dw  24,12,24,12                  ;7i7i
            dw  6,6,24,12,12,12               ;76 5 524
            dw  24,12,24,12                  ;4 3 3 5
            dw  12,12,12,24,12                  ;432 3 5

            ; 主歌时值
            dw  36,24,12                  ;1. 0 1
            dw  12,18,6                  ;21.1
            dw  12,12,12                     ;151
            dw  24,12,24,12                  ;4 3 2 1
            dw  36,24,6,6                  ;1.0 12

            ; 重复时值（完全展开）
            dw  12,12,12,12,12,12            ;3 3 2 4 3 2
            dw  12,12,12                 ;2 2 1
            dw  12,12,12                     ;4 3 2
            dw  24,6,6,36                 ;2 1 2 3.

            ; 间奏时值重复
            dw  36,12,12,12                  ;0.351 (附点)
            dw  24,12,24,12                  ;7i7i
            dw  6,6,24,12,12,12               ;76 5 524
            dw  24,12,24,12                  ;4 3 3 5
            dw  12,12,12,24,12                  ;432 3 5

            ; 副歌时值
            dw  36,24,6,6                  ;1. 0 11
            dw  12,24,12,12,12               ;21 151
            dw  12,6,6,6,6,24,12            ;4 4 4 3 2 21
            dw  18,18,36                  ;1.0 0.

            ; 桥段时值
            dw  12,12,12,12,12,12            ;655 544
            dw  12,12,12,12,12,12               ;322 205
            dw  12,6,6,12,12,12,12            ;544 4 432
            dw  24,6,6,18,18                  ;217 1.0.

            ; 重复桥段时值
            dw  12,12,12,12,12,12            ;655 544
            dw  12,12,12,12,12,12               ;322 203
            dw  12,6,6,6,6,12,12,12            ;333 33 323
            dw  24,12,12,12,12                  ;2 i 101

            ; 尾奏时值
            dw  24,12,36                     ;7 6 6.
            dw  24,12,12,12,6,6               ;0 6 654 4
            dw  36,6,6,24                  ;4.34 5
            dw  36,36                     ;5.0.

            dw  6,6,6,6,6,6        ; 3 2 3 2 3 4 (八分音符x6)
            dw  24,12,6,6              ; 5(四分) 0(八分) 4(八分) 5(八分)
            dw  12,12,6,6              ; 6 0 6 7
            dw  12,12,6,6              ; 1 0 2 i
            dw  24,6,6                 ; 5(四分) 0(八分) 1(附点四分)
            dw  12,12,12                 ; 5 4 4
            dw  24,6,6                 ; 3 3 4
            dw  24,12                    ; 5 0

            ; 第二段时值
            dw  6,6,6,6,6,6        ; 3 2 3 2 3 4
            dw  12,12,6,6              ; 5 0 4 5
            dw  12,12,6,6              ; 6 0 5 6
            dw  12,18,6                 ; 7(附点) 0(八分) ·3(附点)
            dw  12,12,6,6             ; 3 3 0 3
            dw  12,12,12                 ; 4 3 2
            dw  24,6,6                 ; 2 i 7
            dw  12,12,6,6              ; 1 0 5 i

            ; 高潮时值
            dw  24,12,12,12,12           ; 2 i 1 0 5
            dw  24,12,12,12,6,6        ; 2 i 1 0 5 i
            dw  24,12,12,12,6,6        ; 2 i 1 0 5 i
            dw  18,6,12,12,12,12         ; 2·3(附点) 2 i 0 i

            ; 尾奏时值
            dw  24,12,12,12,12           ; 7 6 6 0 5
            dw  24,12,12,12,12           ; 5 4 4 3 2
            dw  36,36                 ; 3·0(附点)
            dw  12,12,12,12,12,12        ; 3 4 3 4 3 2
            dw  36,36                 ; 1·(附点) 1·

            dw  60, 6, 6       ;0.-12 (附点四分+八分)
            dw  12,12,12,12,12,12      ;332 432
            dw  12,12,6,6,12,12,12      ;2211 432
            dw  18,6,6,6,36             ;2.2123.

            ; 间奏时值
            dw  36,12,12,12                ;0.351
            dw  24,12,24,12               ;7i7i
            dw  6,6,24,12,12,12            ;76 5 524
            dw  24,12,24,12               ;4 3 3 5
            dw  12,12,12,24,12               ;432 35

            ; 主歌时值
            dw  36,12,12,6,6             ;1.1 011
            dw  12,24,12,12,12              ;21 151
            dw  24,12,24,12              ;4 3 21
            dw  36,36                  ;1.0.

            ; 桥段时值
            dw  12,12,12,12,12,12            ;655 544
            dw  12,12,12,12,12,12               ;322 205
            dw  12,6,6,12,12,12,12            ;544 4 432
            dw  24,6,6,18,18                  ;217 1.0.

            ; 重复桥段时值
            dw  12,12,12,12,12,12            ;655 544
            dw  12,12,12,12,12,12               ;322 203
            dw  12,6,6,6,6,12,12,12            ;333 33 323
            dw  24,12,12,12,12                  ;2 i 101

            ; 特殊时值处理
            dw  24,12,36                     ;7 6 6.
            dw  24,12,12,12,6,6               ;0 6 654 4
            dw  36,6,6,24                  ;4.34 5
            dw  36,36                     ;5.0.

            ; ; 括号段落时值
            ; dw  24,24,24,24,24            ;4'6'6 '3 '64
            ; dw  24,24,24,24               ;644 444
            ; dw  12,12,12,12,12,12         ;111 222
            ; dw  12,12,12,12               ;111 111

            ; ; 高潮时值
            ; dw  12,12,12,12,12,12,24      ;211111 310
            ; dw  12,12,12,12,12,36         ;211111 2116
            ; dw  24,24,36                  ;533.
            ; dw  12,12,12,12,12,12,12      ;(11111 111)

            dw  -1                            ; 结束标志
dataseg ends

stackseg segment
   db 100h dup (0)
stackseg ends

codeseg segment
start:
    mov ax, stackseg
    mov ss, ax
    mov sp, 100h

    mov ax, dataseg
    mov ds, ax

    lea si, mus_freq
    lea di, mus_time

play:
    mov dx, [si]
    cmp dx, -1
    je end_play
    cmp dx, 0
    je silence
    call sound
    add si, 2
    add di, 2
    jmp play

silence:
    ;========= 新增扬声器关闭操作 =========
    in al, 61h         ; 读取端口状态
    and al, 0FCh       ; 清除位0和位1 (11111100b)
    out 61h, al        ; 关闭扬声器
    ;====================================
    
    mov dx, [di]       ; 获取静音时长
    call delay         ; 使用统一延时
    
    add si, 2          ; 移动到下一个音符
    add di, 2
    jmp play

end_play:
    mov ax, 4c00h
    int 21h

;演奏一个音符
;入口参数：si - 要演奏的音符的频率的地址
;         di - 要演奏的音符的音长的地址
sound:
    push ax
    push dx
    push cx

    ; 初始化8253定时器
    mov al, 0B6h
    out 43h, al
    mov dx, 12h
    mov ax, 34DCh
    div word ptr [si]
    out 42h, al
    mov al, ah
    out 42h, al

    ; 打开扬声器
    in al, 61h
    mov ah, al
    or al, 03h         ; 设置位0和位1
    out 61h, al

    mov dx, [di]       ; 获取音符时长
    call delay         ; 调用统一延时

    ; 关闭扬声器
    mov al, ah         ; 恢复原始端口状态
    out 61h, al

    pop cx
    pop dx
    pop ax
    ret

delay proc
    push cx
wait_delay:
    mov cx, 28000      ; 与原有延时基数一致
delay_loop:
    nop
    loop delay_loop
    dec dx
    jnz wait_delay
    pop cx
    ret
delay endp

codeseg ends
end start